/**
*https://github.com/yiminghe/async-validator
*/

const pattern = {
	integer1: /^[1-9]\d*$/, // 正整数
	number1: /^[1-9]\d*|0$/, // 正数
	phonenumber: /^(1)[0-9]{10}$/, // 手机号码
	email: /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/,
	chinese: /^[\u4e00-\u9fa5a-zA-Z]{0,}$/,
	salary: /^[1-9]|0[\d+]{0,}[\.\d+]{0,}$/,
	sms: /^[0-9]{4,4}$/
}

const msg = "格式错啦";

export const validatePhonenumber = (rule, value, callback) => {
	if (value !== "") {
		if (!pattern.phonenumber.test(value)) {
			callback(new Error(msg));
		}
	}
	callback();
}

export const validateEmail = (rule, value, callback) => {
	if (value !== "") {
		if (!pattern.email.test(value)) {
			callback(new Error(msg));
		}
	}
	callback();
}

export const validateInteger1 = (rule, value, callback) => {
	if (value !== "") {
		if (!pattern.integer1.test(value)) {
			callback(new Error(msg));
		}
	}
	callback();
}

export const validateNumber1 = (rule, value, callback) => {
	if (value !== "") {
		if (!pattern.number1.test(value)) {
			callback(new Error(msg));
		}
	}
	callback();
}

export const validateSms = (rule, value, callback) => {
	if (value !== "") {
		if (!pattern.sms.test(value)) {
			callback(new Error(msg));
		}
	}
	callback();
}

export const validateChinese = (rule, value, callback) => {
	if (value !== "") {
		if (!pattern.chinese.test(value)) {
			callback(new Error(msg));
		}
	}
	callback();
}

export const validateSalary = (rule, value, callback) => {
	if (value !== "") {
		if (!pattern.salary.test(value)) {
			callback(new Error(msg));
		}
	}
	callback();
}

/**
 * 验证身份证
 */
export const checkIdcard = (rule, idcard, callback) => {
	// 判断如果传入的不是一个字符串，则转换成字符串
	idcard = typeof idcard === 'string' ? idcard : String(idcard)
	//正则表达式验证号码的结构
	let regx = /^[\d]{17}[0-9|X|x]{1}$/
	if (regx.test(idcard)) {
		// 验证前面17位数字，首先定义前面17位系数
		let sevenTeenIndex = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2]
		// 截取参数前17位
		let front_seventeen = idcard.slice(0, 17)
		// 截取第18位
		let eighteen = idcard.slice(17, 18)
		// 这里如果是X要转换成小写，如果是数字在这里是字符串类型,则转换成数字类型，好做判断
		eighteen = isNaN(parseInt(eighteen)) ? eighteen.toLowerCase() : parseInt(eighteen)
		// 定义一个变量计算系数乘积之和余数
		let remainder = 0
		//利用循环计算前17位数与系数乘积并添加到一个数组中
		// charAt()类似数组的访问下标一样，访问单个字符串的元素,返回的是一个字符串因此要转换成数字
		for (let i = 0; i < 17; i++) {
			remainder = (remainder += parseInt(front_seventeen.charAt(i)) * sevenTeenIndex[i]) % 11
		}
		//余数对应数字数组
		let remainderKeyArr = [1, 0, 'X', 9, 8, 7, 6, 5, 4, 3, 2]
		// 取得余数对应的值
		let remainderKey = remainderKeyArr[remainder] === 'X' ? remainderKeyArr[remainder].toLowerCase() : remainderKeyArr[remainder]
		// console.log(remainderKey);
		// console.log(eighteen)
		// 如果最后一位数字对应上了余数所对应的值，则验证合格，否则不合格,
		// 由于不确定最后一个数字是否是大小写的X，所以还是都转换成小写进行判断
		if (eighteen === remainderKey) {
			callback()
		} else {
			//console.log('身份证号码格式不正确')
			callback(new Error('身份证号码格式不正确'))
		}
	} else {
		callback(new Error('身份证号码格式不正确'))
	}
}

/* 验证电话（手机+座机）*/
export const checkPhone = (rule, value, callback) => {
	if (value === '') {
		callback(new Error('请输入联系人电话'));
	} else {
		let regPone = null;
		let mobile = /^1(3|4|5|6|7|8|9)\d{9}$/ //最新16手机正则
		let tel = /^(0[0-9]{2,3}\-)?([2-9][0-9]{6,7})+(\-[0-9]{1,4})?$/ //座机
		if (value.charAt(0) == 0) {    // charAt查找第一个字符方法，用来判断输入的是座机还是手机号
			regPone = tel
		} else {
			regPone = mobile
		}
		if (!regPone.test(value)) {
			return callback(
				new Error("请填写联系人电话(座机格式'区号-座机号码')")
			)
		}
		callback()
	}
}
